#-*- coding: utf -8 -*-

"""
modulo: calcktk.py
autor: Jose Caeiro
obs: uma Pequena Calculadora
"""

#modulo para construcao de interfaces graficas
#este modulo esta presente na biblioteca padrao

from Tkinter import *

#funcoes auxiliares para criar de modo mais compacto
#widgets frame e button
#estas funcoes usam o gestor de geometria pack.

def frame(root, side):
    """
    devolve a janela principal
    """
    w = Frame(root)
    #a funcao pack determina a forma de "empacotar"
    #os widgets na janela
    w.pack(side=side, expand=YES, fill=BOTH)
    return w

def button(root, side, text, command=None):
    w = Button(root, text=text, command=command)
    w.pack(side=side, expand=YES, fill=BOTH)
    return w

class Calculator(Frame):
    """
    a janela principal - uma Frame(quadro)e
    neste caso uma representacao de uma calculadora
    """
    def __init__(self):
        Frame.__init__(self)
        self.pack(expand=YES, fill=BOTH)
        #titulo da janela
        self.master.title('Calculadora')
        #nome do icone
        self.master.iconname('calcul1')
        #criacao de display e de uma variavel de acesso ao conteudo do widget
        display = StringVar()
        Entry(self, relief=SUNKEN,textvariable=display).pack(side=TOP,expand = YES,fill=BOTH)
        #cria-se uma Frame para cada linha de digitos
        for key in("123", "456", "789", "-0."):
            keyF = frame(self, TOP)
            #para cada digito cria-se um botao
            for char in key:
                button(keyF, LEFT, char,
                       lambda w=display,
                       s='%s' %char:w.set(w.get()+s))
        opsF = frame(self,TOP)
        for char in "+-*=":
            #associacao dos operadores a botoes
            if char == '=':
                btn = button(opsF, LEFT, char)
                btn.bind('<ButtonRelease-1>',
                         lambda e,
                         s = self,
                         w=display: s.calc(w), '+')
            else:
                btn = button(opsF, LEFT, char,
                             lambda w=display,
                             c=char: w.set(w.get()+' '+
                                           c+' '))
        clearF = frame(self, BOTTOM)
        button(clearF, LEFT, 'CLr', lambda w=display: w.set(''))
    def calc(self, display):
        #eval permite executar codigo
        #por chamada ao interpretador
        try:
            display.set(eval(display.get()))
        except ValueError:
            display.set("ERROR")

#finalmente instancia-se a aplicacao
if __name__=='__main__':
    Calculator().mainloop()
                
            
        
        
